#include <iostream>
using namespace std;

class Person
{
public:
	Person()
	{}
	void Print()
	{
		cout << "name:" << _name << endl;
		cout << "age:" << _age << endl;
		cout << _tel << endl; //间接使用private的成员
	}
//protected:
	string _name = "peter"; // 姓名
protected:
	int _age = 18;   //年龄

private: 
	//父类定义本质：不想被子类继承
	int _tel = 100;
	//父类的私有，子类对象不能直接访问使用，但是可以调用父类成员函数间接使用
};

// 继承后父类的Person的成员（成员函数+成员变量）都会变成子类的一部分。这里体现出了
//Student和Teacher复用了Person的成员。下面我们使用监视窗口查看Student和Teacher对象，可
//以看到变量的复用。调用Print可以看到成员函数的复用。
class Student : public Person  //派生类：继承方式 基类 ，继承方式默认是私有
{
public:
	void func()
	{
		//子类用不了（不可见）
		//cout << _tel << endl;
	}
protected:
	int _stuid; // 学号
};

//class Student : private Person //此时子类把父类成员变私有
//{
//public:
//	void func()
//	{
//		//子类用不了（不可见）
//		//cout << _tel << endl;
//	}
//protected:
//	int _stuid; // 学号
//};

class Teacher : public Person //派生类 继承方式 基类
{
protected:
	int _jobid; // 工号
};

//int main()
//{
//	Person p;
//	p.Print();
//
//	Student s;
//	s.Print();
//	//s._name = "张三";
//
//	Teacher t;
//	//t._name = "张老师";
//
//	return 0;
//}


//赋值兼容转换
int main()
{
	Student s;
	Person p;

	//跟下面机制不一样
	//特殊语法规则：不是类型转换，中间没有产生临时变量
	p = s;
	Person* ptr = &s;
	Person& ref = s;

	ptr->_name += 'x';
	ref._name += 'y';
	s._name += 'z';


	int i = 1234;
	printf("%x\n", i);
	//类型转换会产生临时变量
	char ch = i;//截断
	printf("%x\n", ch);
	i = ch; //提升

	const char& refch = i;//临时变量具有常性，因此加const

	return 0;
}
